package java8.atguigu.teacher.lambda05;

import java8.atguigu.lu.l01.Employee;
import org.junit.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.*;

/**
 * @program lambda
 * @description:
 * @author: zhanglu
 * @create: 2019-05-26 21:15:00
 *
 * 一、方法引用：若lambda体中的内容有方法已经实现了，我们就可以使用"方法引用"
 *              (lambda表达式的另外一种表达形式)
 *
 * 类是一个抽象的概念，对象是类的实例
 * 主要有三种语法格式：
 *
 *  对象::实例方法名
 *
 *  类::静态方法名
 *
 *  类::实例方法名
 *
 *  注意：
 *      1、lambda 体中调用方法的参数列表与返回值类型，要与函数式接口中抽象方法的函数列表和返回值类型保持一致
 *      2、lambda 参数列表中的第一个参数是实例方法的调用者，而第二个参数是实例方法的参数是，可以使用ClassName::方法名
 *
 * 二、构造器引用
 *  格式：
 *      ClassName::new
 *
 *  注意：需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致
 *
 * 三、数组引用
 *  Type::new
 *
 */
public class TestMethodRef {

    /* *************一、方法引用************* */
    /* *************对象::实例方法名************* */
    @Test
    public void test01(){
        PrintStream ps = System.out;
        Consumer<String> con = (x) -> ps.println(x);
        con.accept("sasdad");
        Consumer<String> con1 = System.out::println;    //左边返回值类型与有百年返回值类型一致
        con1.accept("afsfdvf");
    }

    @Test
    public void test02(){
        Employee emp = new Employee();
        Supplier<String> sup = () -> emp.getName();
        System.out.println(sup.get());

        Supplier<String> sup1 = emp::getName;
        System.out.println(sup1.get());
    }


    /* *************类::静态方法名************* */
    @Test
    public void test03(){
        Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
        System.out.println(com.compare(2,4));

        Comparator<Integer> com1 = Integer::compareTo;
        System.out.println(com1.compare(3,1));
    }


    /* *************类::实例方法名************* */
    @Test
    public void test04(){
        BiPredicate<Integer, Integer> bp = (x, y) -> x.equals(y);
        boolean b1 = bp.test(1,1);
        System.out.println(b1);

        BiPredicate<Integer, Integer> bp2 = Integer::equals;
        System.out.println(bp2.test(1,2));

        System.out.println(new Integer(2).equals(4));
    }



    /* *************二、构造器引用************* */
    @Test
    public void test05(){
        Supplier<Employee> sup = () -> new Employee();

        Supplier<Employee> sup1 = Employee::new;
        System.out.println(sup1);

        Function<String, Employee> func = Employee::new;
        System.out.println(func.apply("sl"));

        BiFunction<String, Integer, Employee> bFunc = Employee::new;
        System.out.println(bFunc.apply("sl", 22));
    }


    /* *************三、数组引用************* */
    @Test
    public void test06(){
        Function<Integer, String[]> func = (x) -> new String[x];
        String[] strs = func.apply(10);
        System.out.println(strs.length);

        Function<Integer, String[]> func1 = String[]::new;
        String[] strs1 = func1.apply(20);
        System.out.println(strs1.length);

    }


}
